昨天介紹完使用 channels 來達成 Goroutines,接著要來介紹如何使用 sync 來達成 Goroutines
sync 會用兩天的篇幅來介紹,今天要介紹的是 sync.WaitGroup
就讓我們實際用看看吧
// 宣告 sync.WaitGroup 變數
var wg sync.WaitGroup
// 告訴系統說,總共有幾個 Goroutines 要執行
wg.Add(<要新增 Goroutines 的數量>)
// 告訴系統說,Goroutines 執行完成了
wg.Done()
// 告訴系統說,要等待 Goroutines 全部執行完成,才能做後面的事情
wg.Wait()
var wg sync.WaitGroup
wg.Add(2)
wg.Done()
wg.Wait()
我們一樣用 Day 15 介紹的 A Tour of Go 上的官方範例來進行改寫
package main
import (
"fmt"
"sync"
"time"
)
var wg sync.WaitGroup
func say(s string) {
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
wg.Done()
}
func main() {
wg.Add(2)
go say("world")
go say("hello")
wg.Wait()
}
下面就來講解用 sync.WaitGroup 改寫後的 Code
sync
package,因為我們要用的 sync.WaitGroup 在這個 package 內 -> Line 5
sync.WaitGroup
變數 wg
-> Line 9
wg.Done()
,告訴系統說,這個 Goroutines 執行完成了 -> Line 16
wg.Add(2)
-> Line 20
今天簡單介紹了 Goroutines 中的 sync.WaitGroup 用法
個人覺得用起來跟 Swift 中的 DispatchGroup 有一點點像
明天要來介紹 sync 的另外一個用法,sync.Mutex
明天見~